package com.panghl.service;


import com.panghl.entity.User;
import com.panghl.mapper.UserMapper;
import org.springframework.cache.annotation.*;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 声明式注解操作缓存
 */
@Service
@CacheConfig(cacheNames = "userCache")
public class AnnoService {

    @Resource
    private UserMapper userMapper;

    /**
     * @Cacheable注解
     * 如果没有缓存则会执行方法并将返回值缓存，如果有缓存时，不会执行方法而是直接返回缓存中的值
     * @param id
     * @return
     */
    @Cacheable(key = "#id")
    public User getById(int id) {
        User user = null;
        Object obj = null;
        if (null == obj){
            user = userMapper.selectById(id);
        }
        System.out.println(" 执行了 getById");
        return user;
    }

    /**
     * @CachePut注解
     * 不管有没有缓存都会执行方法并将结果缓存起来
     */
    @CachePut(key = "#user.id")
    public User add(User user){
        userMapper.insert(user);
        System.out.println(" 执行了 insert");
        return user;
    }

    /**
     * @CacheEvict注解
     * 移除指定缓存
     */
    @CacheEvict(key = "#id")
    public void deleteUserById(Integer id){
        userMapper.deleteById(id);

        System.out.println(" 执行了 deleteUserById");
    }


    /**
     * 创建用户，同时使用新的返回值的替换缓存中的值
     * 创建用户后会将userCache缓存全部清空;allEtries设置为true，将集合中的缓存一下删完。
     */
    @Caching(
            evict = {@CacheEvict(value = "userCache",allEntries = true)},
            put = {@CachePut(value = "userCache",key = "#user.id")}
    )
    public User createUser(User user) {
        userMapper.insert(user);
        System.out.println(" 执行了 createUser");
        return user;
    }

}
